package com.auto.survey.activity.monitoring.dao

import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Transaction
import androidx.room.Update
import com.auto.survey.activity.monitoring.entity.MontoringProject
import com.auto.survey.activity.monitoring.entity.relations.MonitoringProjectWithObject
import kotlinx.coroutines.flow.Flow

/**
 * 项目数据访问对象接口
 * 定义与项目相关的数据库操作
 */
@Dao
interface MonitoringProjectDao {
    /**
     * 获取所有项目列表，按项目ID降序排列
     * @return 项目列表Flow流
     */
    @Query("SELECT * FROM MontoringProject ORDER BY id DESC")
    fun getMonitoringProjects(): Flow<List<MontoringProject>>

    /**
     * 根据项目ID获取项目信息
     * @param id 项目ID
     * @return 项目实体或null
     */
    @Query("SELECT * FROM MontoringProject WHERE id = :id")
    suspend fun getMontoringProjectById(id: Int): MontoringProject?

    /**
     * 插入新项目
     * @param project 项目实体
     * @return 插入的项目ID
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertMontoringProject(project: MontoringProject): Long

    /**
     * 更新项目信息
     * @param project 项目实体
     */
    @Update
    suspend fun updateMontoringProject(project: MontoringProject)

    /**
     * 删除项目
     * @param project 项目实体
     */
    @Delete
    suspend fun deleteMontoringProject(project: MontoringProject)

    /**
     * 根据项目ID删除项目
     * @param id 项目ID
     */
    @Query("DELETE FROM MontoringProject WHERE id = :id")
    suspend fun deleteMontoringProjectById(id: Int)

    /**
     * 获取项目总数
     * @return 项目数量
     */
    @Query("SELECT COUNT(*) FROM MontoringProject")
    suspend fun getMontoringProjectCount(): Int


    /**
     * 根据项目ID获取项目及其关联的监测对象
     * @param projectId 项目ID
     * @return 项目及其监测对象
     */
    @Transaction
    @Query("SELECT * FROM MontoringProject WHERE id = :projectId")
    suspend fun getMonitoringProjectWithObject(projectId: Int): MonitoringProjectWithObject?

}